package com.sequenceiq.cloudbreak.conf; import static com.cedarsoftware.util.io.JsonWriter.CUSTOM_WRITER_MAP; import java.io.IOException; import java.io.Writer; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.annotation.PostConstruct; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.cedarsoftware.util.io.JsonReader; import com.cedarsoftware.util.io.JsonWriter; @Configuration public class JsonIoConfig { @PostConstruct public void setupJsonReader() { JsonReader.assignInstantiator("com.google.common.collect.RegularImmutableMap", new JsonReader.MapFactory()); JsonReader.assignInstantiator("com.google.common.collect.EmptyImmutableBiMap", new JsonReader.MapFactory()); JsonReader.assignInstantiator("com.google.common.collect.SingletonImmutableBiMap", new JsonReader.MapFactory()); JsonReader.assignInstantiator("java.util.Collections$EmptyMap", new JsonReader.MapFactory()); JsonReader.assignInstantiator("java.util.Collections$SingletonMap", new JsonReader.MapFactory()); JsonReader.assignInstantiator("com.google.common.collect.SingletonImmutableList", new JsonReader.CollectionFactory()); JsonReader.assignInstantiator("com.google.common.collect.RegularImmutableList", new JsonReader.CollectionFactory()); JsonReader.assignInstantiator("java.util.Collections$EmptyList", new JsonReader.CollectionFactory()); JsonReader.assignInstantiator("java.util.Collections$SingletonList", new JsonReader.CollectionFactory()); JsonReader.assignInstantiator("com.google.common.collect.RegularImmutableSet", new JsonReader.CollectionFactory()); JsonReader.assignInstantiator("java.util.Collections$EmptySet", new JsonReader.CollectionFactory()); JsonReader.assignInstantiator("java.util.Collections$SingletonSet", new JsonReader.CollectionFactory()); } @Bean(name = "JsonWriterOptions") public Map<String, Object> getCustomWriteOptions() { Map<Class<?>, JsonWriter.JsonClassWriterBase> customWriters = new HashMap<>(); customWriters.put(Exception.class, new NonPrimitiveFormJsonWriter() { @Override public void write(Object o, boolean showType, Writer output) throws IOException { output.write("\"detailMessage\":"); JsonWriter.writeJsonUtf8String(((Exception) o).getMessage(), output); } }); return Collections.singletonMap(CUSTOM_WRITER_MAP, customWriters); } private abstract static class NonPrimitiveFormJsonWriter implements JsonWriter.JsonClassWriter { @Override public boolean hasPrimitiveForm() { return false; } @Override public void writePrimitiveForm(Object o, Writer output) throws IOException { throw new UnsupportedOperationException("Primitive form write not allowed"); } } }